// > 进程映像由PCB控制块，所运行的程序和所运行的数据三部分组成，是静态的，也称之为进程实体
// > 进程映像是进程执行的上下文环境，包括CPU中各通用寄存器的值，进程的内存映像，打开文件的状态和进程占用资源的信息等。

// 在Linux中，exec函数可以将当前进程的核心映像替换为新的进程映像，换而言之，使当前的进程运行新的程序
// exec实际上是一系列函数，exec系列函数都是以execl开头或者execv开头（l表示列表list，v表示矢量vector），exec()函数将当前进程映像替换为新的进程映像
// exec函数一旦调用成功即执行新的程序，不返回。只有失败才返回，错误值-1。所以通常我们直接在exec函数调用后直接调用perror()和exit()，无需if判断。

// exec函数族名字很相近，使用起来也很相近，它们的一般规律如下：
// l (list)                           命令行参数列表
// p (path)                       搜素file时使用path变量
// v (vector)                    使用命令行参数数组
// e (environment)       使用环境变量数组,不使用进程原有的环境变量，设置新加载程序运行的环境变量

// 进行不同的组合，就有了六个函数
// 所谓exec函数族，其实有六种以exec开头的函数，统称exec函数：
// int execl(const char *path, const char *arg, ...);
// int execlp(const char *file, const char *arg, ...);
// int execle(const char *path, const char *arg, ..., char *const envp[]);
// int execv(const char *path, char *const argv[]);
// int execvp(const char *file, char *const argv[]);
// int execve(const char *path, char *const argv[], char *const envp[];


#include "exec_try.h"


int main(int argc, char * argv[]){
    execl("/bin/ls", "ls", NULL);
    // char ** arg = {"hello_world", "test1", "test2"};
    // execv("../bin/hello_world", arg);


    // // e (environment)，表示使用新的环境来运行
    // execl("../bin/test_environ", "test_environ", NULL);
    // execle("../bin/test_environ", "test_environ",NULL);

    // vp和lp会去PATH里查可执行文件，不同的是v（vector）要求参数放到一个列表里
    // lp （list）则可以将参数列出来，以变参宏的形式罗列

    // l（list）表示将参数列入，需要写可执行文件的绝对路径，cd不是可执行文件
}